import basePageOptions from './gh-page-base.js';
import mixDecorator from './gh-page-mixins.js'
import regeneratorRuntime from '../vendor/regenerator-runtime/runtime.js';

let listPageOptions = {
  /**
   * 页面的初始数据
   */
  data: {
    //列表参数 
    listProp: {
      /*----------------------------可配置参数------------------------*/
      //默认页容量
      pageSize: 10,
      //接口地址Key名      
      key: "",
      //业务参数（pageSize，index会再后面继承）     
      data: {},
      //数据对应键名    
      rowsKey: "rows",
      //总行数对应键名
      totalKey: "totalCount",
      /*-----------------------------组件内数据---------------------*/
      //当前页码
      pageIndex: 1,
      //最大页码
      maxPageIndex: 0,
      //数据源
      list: []
    }
  },

  onReady: function() {
    this.loadList("PullDown");
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function() {
    console.log("下拉：onPullDownRefresh");
    //执行预设回调
    typeof this.myonPullDownRefresh == "function" && this.myonPullDownRefresh();
    //下拉
    this.loadList("PullDown");
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function() {
    console.log("触底：onReachBottom");
    //执行预设回调
    typeof this.myonReachBottom == "function" && this.myonReachBottom();
    //触底
    this.loadList("ReachBottom");
  },



  /*--------------------------------------------公共方法--------------------------------*/
  //列表刷新公共方法
  loadList(type) { // type(下拉（PullDown） 还是 触底（ReachBottom）)
    if (this.data.listProp.key != "") {
      if (this.isLoad(type)) {
        //数据加载前
        this._beforeLoad(type);
        //设置页面Index业务逻辑
        this._setPageInfo(type);
        //获取数据源
        this.GetListData(type);
      }
    } else {
      throw new Error("尚未配置key参数！");
    }
  },
  //判断是否符合继续加载数据条件
  isLoad(type) {
    return type === "ReachBottom" ? (this.data.listProp.maxPageIndex == 0 || this.data.listProp.pageIndex < this.data.listProp.maxPageIndex) : true;
  },
  //加载前执行
  _beforeLoad(type) {
    type == "PullDown" &&
      //下拉图标
      wx.setBackgroundTextStyle({
        textStyle: 'dark' // 下拉背景字体、loading 图的样式为dark
      });
  },

  //设置pageListInfo页面参数  pageObject.pageSize   pageIndex
  _setPageInfo(type) {
    //根据业务类型处理 page参数
    type === "PullDown" ? this.setData({
      "listProp.pageIndex": 1
    }) : this.setData({
      "listProp.pageIndex": ++this.data.listProp.pageIndex
    });
  },
  //加载完成执行
  _afterLoad(type) {
    type == "PullDown" && wx.stopPullDownRefresh();
  },
  //获取数据源
  async GetListData(type) {
    let $self = this;
    //显示loading图标
    wx.showLoading({
      title: '数据加载中...',
    });


    // // 异步获取数据源
    // this._request().then((val) => {
    //   //记录缓存数据
    //   $self._saveLocalData(val, type);
    //   //取消等待效果
    //   wx.hideLoading();
    //   //数据加载完成
    //   $self._afterLoad(type);
    // });



    let data = await this._request();
    //缓存数据
    this._saveLocalData(data, type);
    //取消等待效果
    wx.hideLoading();
    //数据加载完成
    this._afterLoad(type);

  },
  //记录缓存数据
  _saveLocalData(val, type) {
    const newList = this._getNewList(val, type);
    console.log(newList);
    //本地数据   rowsKey   totalKey
    this.setData({
      "listProp.list": newList ,
      "listProp.maxPageIndex": Math.ceil(parseInt(val.data[this.data.listProp.totalKey]) / this.data.listProp.pageSize)
    });
  },
  //获取数据源集合
  _getNewList(val, type) {
    return type == "PullDown" ?
      val.data[this.data.listProp.rowsKey] :
      this.data.listProp.list.concat(val.data[this.data.listProp.rowsKey]);
  },


  //requset请求  key     data pageSize  pageIndex
  async _request() {
    const {
      key,
      data,
      pageSize,
      pageIndex
    } = this.data.listProp;

    const para = {
      key,
      data: {
        jsonStr: JSON.stringify({
          ...data,
          pageSize,
          pageIndex
        })
      }
    };

    console.log(para);

    return await basePageOptions.gh.fetch(para);
    // return basePageOptions.gh.fetch(para);
  }

};

listPageOptions = mixDecorator(basePageOptions, listPageOptions)

//mixDecorator(listPageOptions, mixDecorator(basePageOptions, listPageOptions));

export default listPageOptions;